package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;

import java.util.concurrent.Future;

@Slf4j
@Component
public class SyncService {
    /**
     * 在默认情况下，未设置TaskExecutor时，默认是使用SimpleAsyncTaskExecutor这个线程池，但此线程不是真正意义上的线程池，因为线程不重用，每次调用都会创建一个新的线程。可通过控制台日志输出可以看出，每次输出线程名都是递增的。
     */

    /**
     * 调用的异步方法，不能为同一个类的方法，简单来说，因为Spring在启动扫描时会为其创建一个代理类，而同类调用时，还是调用本身的代理类的，所以和平常调用是一样的。其他的注解如@Cache等也是一样的道理，说白了，就是Spring的代理机制造成的。
     * @throws InterruptedException
     */
    public void test() throws InterruptedException {
        System.out.println("调用test()方法");
        System.out.println("导致asyncEvent()的@Async无效");
        asyncEvent();
    }

    @Async(value = "asyncPoolTaskExecutor")
    public Future<String> asyncEvent() throws InterruptedException {
        System.out.println("进入异步放fa");
        //休眠1s
        Thread.sleep(3000);
        System.out.println("休眠3秒结束了");
        return new AsyncResult<>("异步方法的返回值111");

    }

    public void syncEvent() throws InterruptedException {
        Thread.sleep(3000);
        System.out.println("同步方法输出：{}!"+System.currentTimeMillis());
        //log.info("同步方法输出：{}!", System.currentTimeMillis());
    }

}